package cn.git.init;

import cn.hutool.core.util.StrUtil;
import com.huaban.analysis.jieba.WordDictionary;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * @description: 自定义分词词典加载初始化
 * @program: bank-credit-sy
 * @author: lixuchun
 * @create: 2024-08-13
 */
@Slf4j
@Component
public class AnalyzerInit {

    /**
     * 敏感词集合
     */
    public static Set<String> sensitiveWordsSet = new HashSet<>();

    /**
     * 自定义词典路径
     */
    private static final String DICT_PATH = "/dict/custom.dict";

    /**
     * 临时文件名称
     */
    private static final String TEMP_FILE_NAME = "custom_tmp.dict";

    /**
     * 系统标识win系统
     */
    private static final String WINDOWS_SYS = "windows";

    /**
     * 系统标识属性
     */
    private static final String OS_FLAG = "os.name";

    @Autowired
    private ResourceLoader resourceLoader;

    /**
     * 初始化加载自定义分词词典
     *
     * idea测试环境可用，linux分词加载自定义字典，需要读取jar包中文件内容，spring boot 打包运行后，无法直接读取，获取Path对象
     * 所以复制一份临时文件到本地，再加载
     */
    @PostConstruct
    public void analyzerInit() throws IOException {
        // 判断当前系统为windows系统还是linux系统
        String osName = System.getProperty(OS_FLAG);
        if (osName.toLowerCase().contains(WINDOWS_SYS)) {
            try {
                // 使用ClassPathResource加载资源文件
                Resource resource = new ClassPathResource("dict/custom.dict");

                // 获取文件的路径
                Path path = resource.getFile().toPath();

                // 加载自定义词典
                WordDictionary.getInstance().loadUserDict(path);
                System.out.println("User dictionary loaded successfully.");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            // linux系统，获取项目运行路径
            String workPath = System.getProperty("user.dir");

            log.info("当前系统为linux系统，获取项目运行路径：{}", workPath);

            // 读取配置文件流，并且生成一个临时文件
            InputStream dictInputStream = this.getClass().getResourceAsStream(DICT_PATH);
            File dictTempFile = new File(workPath.concat(StrUtil.SLASH).concat(TEMP_FILE_NAME));
            FileCopyUtils.copy(dictInputStream, new FileOutputStream(dictTempFile));

            // 加载自定义的词典进词库
            WordDictionary.getInstance().loadUserDict(dictTempFile.toPath());
            log.info("加载自定义词典信息完毕");

            // 删除临时文件
//            dictTempFile.delete();
        }

        // 开始加载数据库中敏感词信息,大写字母修改为小写字母，此过程正常应该是在数据库中获取
        for (int i = 0; i < 1000000; i++) {
            if (i == 0) {
                sensitiveWordsSet.add("十八大");
                sensitiveWordsSet.add("小狗蛋x");
                sensitiveWordsSet.add("傻x");
                sensitiveWordsSet.add("牛p");
                sensitiveWordsSet.add("先烈的电话");
            } else {
                sensitiveWordsSet.add("傻x" + i);
                sensitiveWordsSet.add("牛p" + i);
            }
        }
        log.info("数据库中敏感分词加载完毕!");
    }
}
